package br.com.sgpv2.controler.nivel;

import java.util.List;
import java.util.Locale;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import br.com.sgpv2.controler.SGPController;
import br.com.sgpv2.entity.JsonResponse;
import br.com.sgpv2.entity.organograma.Nivel;
import br.com.sgpv2.service.cargo.CargoService;
import br.com.sgpv2.service.entidade.EntidadeService;
import br.com.sgpv2.service.nivel.NivelService;

/**
 * Handles requests for the application /nivel.
 */

@Controller
public class NivelController extends SGPController {

	@Autowired
	private NivelService nivelService;

	@Autowired
	private CargoService cargoService;

	@Autowired
	private EntidadeService entidadeService;

	/**
	 * Página de pessoas - controller da página niveis.
	 * 
	 * @throws Exception.
	 */
	@RequestMapping(value = "/niveis", method = RequestMethod.GET)
	public String niveis(Locale locale, Model model) throws Exception {

		List<Nivel> niveis = nivelService.listar();

		configurarPaginacao(niveis, model);
		model.addAttribute("niveis", getPagedListHolder().getPageList());

		return "niveis";
	}
	
	/**
	 * Página de pessoas - controller da página pessoas.
	 * @throws Exception.
	 */
	@RequestMapping(value = "/niveis", method = RequestMethod.POST)
	public String niveis(Locale locale, Model model, @RequestParam String descricao) throws Exception {
		
		List<Nivel> niveis = nivelService.consultarNivelPorDescricao(descricao);
		
		configurarPaginacao(niveis, model);
		model.addAttribute("niveis", getPagedListHolder().getPageList());
		
		return "niveis";
	}

	/**
	 * avança para página de inclusão de nivel.
	 * 
	 * @throws Exception
	 */
	@RequestMapping(value = "/nivel/salvar", method = RequestMethod.GET)
	public String salvar(Model model) throws Exception {

		model.addAttribute("nivel", new Nivel());
		model.addAttribute("cargos", cargoService.listar());

		return "nivel_incluir";
	}

	/**
	 * inclui um cargo no sistema.
	 * 
	 * @throws Exception
	 */
	@RequestMapping(value = "/nivel/salvar", method = RequestMethod.POST)
	public String salvar(@ModelAttribute Nivel nivel, BindingResult result,
			Model model) throws Exception {

		if (nivel != null) {
			nivel.setEntidade(entidadeService.buscarEntidade());
			nivel.setValor(transformStringToBigDecimal(nivel.getValorTransiente()));
			nivel.setCargoFuncao(cargoService.buscar(Integer.parseInt(nivel.getCodigoCargoFuncao())));
			nivelService.salvar(nivel);
		}

		return "redirect:../niveis";
	}

	/**
	 * avança para página de alteração de nivel.
	 * 
	 * @throws Exception
	 */
	@RequestMapping(value = "/nivel/alterar/{pk}", method = RequestMethod.GET)
	public String getAlterar(@PathVariable Integer pk, Model model)
			throws Exception {
		Nivel nivelAlteracao = nivelService.buscar(pk);
		if (nivelAlteracao != null) {
			nivelAlteracao.setValorTransiente(nivelAlteracao.getValor()
					.toString().replace(".", ","));
			model.addAttribute("nivel", nivelAlteracao);
			model.addAttribute("cargos", cargoService.listar());
			return "nivel_alterar";
		} else {
			return "redirect:../niveis";
		}
	}

	/**
	 * avança para página de alteração de nivel.
	 * 
	 * @throws Exception
	 */
	@RequestMapping(value = "/nivel/alterar", method = RequestMethod.POST)
	public String alterar(@ModelAttribute Nivel nivel, Model model,
			BindingResult result) throws Exception {

		if (nivel != null) {
			nivel.setEntidade(entidadeService.buscarEntidade());
			nivel.setValor(transformStringToBigDecimal(nivel.getValorTransiente()));
			nivel.setCargoFuncao(cargoService.buscar(Integer.parseInt(nivel.getCodigoCargoFuncao())));
			nivelService.alterar(nivel);
		}
		return "redirect:../niveis";
	}

	/**
	 * Exclui um nivel.
	 * 
	 * @throws Exception
	 */
	@RequestMapping(value = "/nivel/excluir/{pk}", method = RequestMethod.GET)
	public String excluir(@PathVariable Integer pk, Model model)
			throws Exception {
		Nivel nivelExclusao = nivelService.buscar(pk);

		if (nivelExclusao != null) {
			nivelService.excluir(nivelExclusao);
		}

		return "redirect:/niveis";
	}

	/**
	 * Valida a exclus�o de um nivel.
	 * 
	 * @throws Exception
	 */
	@ResponseBody
	@RequestMapping(value = "/nivel/validarExclusao/{idNivel}", method = RequestMethod.GET)
	public JsonResponse validarExclusao(@PathVariable String idNivel,
			Model model) throws Exception {
		JsonResponse jsonResponse = new JsonResponse();
		jsonResponse.setSuccess(nivelService.validarExclusao(idNivel));
		return jsonResponse;
	}

	@ResponseBody
	@RequestMapping(value = "/nivel/paginacao/{acao}", method = RequestMethod.GET)
	public ModelAndView paginacao(@PathVariable String acao, Model model)
			throws Exception {
		navegarPaginacao(acao, model);
		model.addAttribute("niveis", getPagedListHolder().getPageList());
		return new ModelAndView("nivel.lista");
	}

}
